﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PatientsManagement.Database;

namespace PatientsManagement.Users
{
    public partial class AddUser : Form
    {
        bool isAdmin = false;
        Validator validator;
        bool createPressed = false;
        bool edit = false;

        public AddUser(string name,string foreName,string surName,string type,string currentName)
        {
            InitializeComponent();
            edit = true;
            this.isAdmin = true;
            FillCombo();
            validator = new Validator(controlsErrorProvider);
            userName.ReadOnly = true;
            userName.Text = name.ToLower();
            forename.Text = foreName;
            surname.Text = surName;
            add.Text = "Zapisz";
            userType.SelectedItem = type;
            if (currentName.ToLower() == name.ToLower())
                userType.Enabled = false;
        }

        public AddUser(bool isAdmin)
        {
            InitializeComponent();
            this.isAdmin = isAdmin;
            FillCombo();
            validator = new Validator(controlsErrorProvider);
            validator.IsEmpty(userName, "Nazwa użytkownika nie może być pusta");
            validator.PasswordValidation(password, "Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
            validator.PasswordValidation(password2,"Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
            validator.IsEmpty(forename, "Imię nie może być puste");
            validator.IsEmpty(surname, "Nazwisko nie może być puste");
        }

        private void FillCombo()
        {
            List<string> types = UsersData.UserTypes();
            foreach (string type in types)
            {
                userType.Items.Add(type);
                if (type == "Admin" && isAdmin == false)
                    userType.Items.RemoveAt(0);
            }
            userType.SelectedIndex = 0;
        }

        #region Controls Validation
        private void userNameText_Validating(object sender, EventArgs e)
        {
            if (!edit)
            {
                validator.IsEmpty(sender, "Nazwa użytkownika nie może być pusta");
                userInfo.Text = "Wprowadź poprawną nazwę użytkownika";
                userInfo.Visible = false;
            }
        }

        private void passwordText_Validating(object sender, EventArgs e)
        {
            if (edit)
                validator.PasswordValidation(sender, "Hasło musi zawierać co najmniej 6 znaków");
            else
                validator.PasswordValidation(sender, "Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
            passInfo.Visible = false;
            if (password.Text == password2.Text) pass2Info.Visible = false;
        }

        private void password2Text_Validating(object sender, EventArgs e)
        {
            if (edit)
                validator.PasswordValidation(sender, "Hasło musi zawierać co najmniej 6 znaków");
            else
                validator.PasswordValidation(sender, "Hasło nie może być puste", "Hasło musi zawierać co najmniej 6 znaków");
            userInfo.Text = "";
            pass2Info.Visible = false;
        }

        private void forenameText_Validating(object sender, EventArgs e)
        {
            validator.IsEmpty(sender, "Imię nie może być puste");
            forenameInfo.Visible = false;
        }

        private void surnameText_Validating(object sender, EventArgs e)
        {
            validator.IsEmpty(sender, "Nazwisko nie może być puste");
            surnameInfo.Visible = false;
        }
        #endregion

        private void AddUser_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!edit)
            {
                if (createPressed)
                {
                    if (validator.ValidateUser(userName.Text))
                    {
                        userInfo.Visible = true;
                        userInfo.Text = "Podany użytkownik już istnieje";
                        e.Cancel = true;
                    }
                    if (password.Text != password2.Text)
                    {
                        pass2Info.Visible = true;
                        pass2Info.Text = "Hasło różni się od podanego wyżej";
                        e.Cancel = true;
                    }
                    if (!validator.NoValidation(new List<TextBox> { userName, password, password2, forename, surname }))
                    {
                        e.Cancel = true;
                        if (controlsErrorProvider.GetError(userName) != "")
                            userInfo.Visible = true;
                        if (controlsErrorProvider.GetError(password) != "")
                            passInfo.Visible = true;
                        if (controlsErrorProvider.GetError(password2) != "")
                        {
                            pass2Info.Text = "Podane hasło jest nieprawidłowe";
                            pass2Info.Visible = true;
                        }
                        if (controlsErrorProvider.GetError(forename) != "")
                            forenameInfo.Visible = true;
                        if (controlsErrorProvider.GetError(surname) != "")
                            surnameInfo.Visible = true;
                    }
                    createPressed = false;
                }
                if (e.Cancel == false && createPressed == true)
                {
                    if (isAdmin == false)
                        MessageBox.Show("Użytkownik " + userName.Text + " został dodany do bazy danych.\r\nZgłoś się do administratora, w celu aktywacji konta.");
                    else
                        MessageBox.Show("Użytkownik " + userName.Text + " został dodany do bazy danych.");
                }
            }
            else
            {
                if (createPressed)
                {
                    if (password.Text != password2.Text)
                    {
                        pass2Info.Visible = true;
                        pass2Info.Text = "Hasło różni się od podanego wyżej";
                        e.Cancel = true;
                    }
                    if (!validator.NoValidation(new List<TextBox> { userName, password, password2, forename, surname }))
                    {
                        e.Cancel = true;
                        if (controlsErrorProvider.GetError(password) != "")
                            passInfo.Visible = true;
                        if (controlsErrorProvider.GetError(password2) != "")
                        {
                            pass2Info.Text = "Podane hasło jest nieprawidłowe";
                            pass2Info.Visible = true;
                        }
                        if (controlsErrorProvider.GetError(forename) != "")
                            forenameInfo.Visible = true;
                        if (controlsErrorProvider.GetError(surname) != "")
                            surnameInfo.Visible = true;
                    }
                    createPressed = false;
                }
            }
        }

        public void AddToDatabase()
        {
            UsersData.AddUser(userName.Text,password.Text,forename.Text,surname.Text,userType.Text,isAdmin);
        }

        public void SaveChangesToDatabase()
        {
            UsersData.EditUser(userName.Text, password.Text, forename.Text, surname.Text, userType.Text);
            MessageBox.Show("Zmiany dla użytkownika " + userName.Text + " zostały zapisane.");
        }

        private void add_Click(object sender, EventArgs e)
        {
            createPressed = true;
        }
    }
}
